package com.tmxk.jdbc02.dao.impl;

import com.tmxk.jdbc02.dao.EmpDao;
import com.tmxk.jdbc02.utils.BaseDao;
import com.tmxk.jdbc02.vo.DeptEmpVO;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 数据访问层实现类
 */
public class EmpDaoImpl extends BaseDao implements EmpDao {

    @Override
    public List<DeptEmpVO> queryDeptEmpByInfo(Map<String, Object> map) {
        //1. 创建集合对象,用来存储数据库查询返回的rs结果集数据
        List<DeptEmpVO> deptEmpVOList = new ArrayList<>();
        //2. 创建单个DeptEmpVO对象实例
        DeptEmpVO deptEmpVO = null;
        // 3. 定义查询的sql
        StringBuffer sb = new StringBuffer();
        if (map != null) {
            // 分页
            sb.append(" SELECT * FROM ( ");
            sb.append("   SELECT * FROM ( ");
            sb.append("     SELECT ROWNUM RN , E.EMPNO,E.ENAME,E.JOB,E.MGR,E.HIREDATE,E.SAL,E.COMM,E.DEPTNO,D.DNAME,D.LOC  ");
            sb.append("     FROM EMP E      ");
            sb.append("     LEFT JOIN DEPT D ON D.DEPTNO = E.DEPTNO ) EMP  ");
            sb.append("   WHERE EMP.RN <= ? ) ED WHERE ED.RN > ?  ");
            sb.append(" ORDER BY ED.SAL DESC ");
            // oracle分页 第一个 ? 占位符是 结束行数目    第二个 ? 占位符是 开始行数目
            // 结束行数目变量
            int endLine = (int) map.get("endLine");
            // 开始行数目变量
            int startLine = (int)map.get("startLine");
            //4 . 调用公共查询方法
            super.rs = super.executeQuery(sb.toString(),new Object[]{endLine,startLine});
        }else{
            // 不分页
            sb.append("     SELECT ROWNUM RN , E.EMPNO,E.ENAME,E.JOB,E.MGR,E.HIREDATE,E.SAL,E.COMM,E.DEPTNO,D.DNAME,D.LOC  ");
            sb.append("     FROM EMP E      ");
            sb.append("     LEFT JOIN DEPT D ON D.DEPTNO = E.DEPTNO   ");
            sb.append("     ORDER BY E.SAL DESC ");
            //4 . 调用公共查询方法
            super.rs = super.executeQuery(sb.toString());
        }
        // 5. 循环遍历rs结果集
        try{
            while(rs.next()){
                //5.1. 创建deptEmpVO实例对象
                deptEmpVO = new DeptEmpVO();
                //5.2. 将rs结果集中获取的数据通过set方法进行赋值给deptEmpVO对象
                deptEmpVO.setEmpNo(rs.getInt("EMPNO"));
                deptEmpVO.seteName(rs.getString("ENAME"));
                deptEmpVO.setJob(rs.getString("JOB"));
                deptEmpVO.setMgr(rs.getInt("MGR"));
                deptEmpVO.setHireDate(rs.getDate("HIREDATE"));
                deptEmpVO.setSal(rs.getDouble("SAL"));
                deptEmpVO.setComm(rs.getDouble("COMM"));
                deptEmpVO.setDeptNo(rs.getInt("DEPTNO"));
                deptEmpVO.setdName(rs.getString("DNAME"));
                deptEmpVO.setLoc(rs.getString("LOC"));
                //5.3. 将deptEmpVO单个对象存储到集合对象中
                deptEmpVOList.add(deptEmpVO);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            super.closeAllConn(rs,pstmt,conn);
        }
        return deptEmpVOList;
    }
}
